package net.lenards;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.TimeZone;
import com.amazonaws.AmazonClientException;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.RegionUtils;
import com.amazonaws.services.kinesis.AmazonKinesis;
import com.amazonaws.services.kinesis.AmazonKinesisClient;
import com.amazonaws.services.kinesis.model.DescribeStreamResult;
import com.amazonaws.services.kinesis.model.PutRecordRequest;
import com.amazonaws.services.kinesis.model.PutRecordResult;
import com.amazonaws.services.kinesis.model.ResourceNotFoundException;
/**
* Producer event records into the Kinesis stream.
*
* Note: Assumes you have configured a Kinesis stream in AWS w/ DynamoDB backing.
*/
public class Producer
{
private static final String APP = "StockTradesProcessor";
private static final String VERSION = "0.0.1";
private static final String[] EVENT_NAMES = {"baz", "bar", "foo", "qux"};
private static ClientConfiguration CLIENT_CONF;
static {
ClientConfiguration config = new ClientConfiguration();
config.setUserAgent(String.format("%s %s/%s",
ClientConfiguration.DEFAULT_USER_AGENT,
APP, VERSION));
CLIENT_CONF = config;
}
public static void verify(String[] args) {
if (!(args.length == 2)) {
System.out.println("Usage: \n\tApp <stream-name> <aws-region>");
System.exit(1);
}
}
public static AWSCredentials getCreds() throws Exception {
String msg = "Cannot load AWS credentials, no 'default' profile available.";
try {
AWSCredentialsProvider provider =
new ProfileCredentialsProvider("default");
return provider.getCredentials();
} catch (Exception e) {
throw new AmazonClientException(msg, e);
}
}
public static void checkStream(DescribeStreamResult result) {
String statusText = result.getStreamDescription().getStreamStatus();
String streamName = result.getStreamDescription().getStreamName();
if (!statusText.equals("ACTIVE")) {
System.err.println("Inactive Stream: " + streamName);
System.exit(1);
} else {
System.out.println("Stream " + streamName + " is ACTIVE!");
}
}
// "2014-10-07T12:20:08Z;foo;1"
public static String getCurrentTimeStr() {
TimeZone tz = TimeZone.getTimeZone("UTC");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(tz);
return sdf.format(new java.util.Date());
}
public static String getRandomEventName() {
Random rnd = new Random(System.currentTimeMillis());
int idx = rnd.nextInt(EVENT_NAMES.length);
return EVENT_NAMES[idx];
}
public static String getEventRecord() {
Random rnd = new Random(System.currentTimeMillis());
return String.format("%s;%s;%d",
getCurrentTimeStr(),
getRandomEventName(),
rnd.nextInt(10));
}
public static void putEventRecord(AmazonKinesis client, String stream) throws Exception {
String eventRecord = getEventRecord();
PutRecordRequest put = new PutRecordRequest();
put.setStreamName(stream);
put.setPartitionKey("test:650");
put.setData(ByteBuffer.wrap(eventRecord.getBytes("UTF-8")));
try {
PutRecordResult result = client.putRecord(put);
System.out.println(result);
} catch (AmazonClientException ex) {
System.out.println("PutRecord failed.");
}
}
public static void main(String[] args) throws Exception {
verify(args);
String stream = args[0];
Region region = RegionUtils.getRegion(args[1]);
AWSCredentials credentials = getCreds();
AmazonKinesis client = new AmazonKinesisClient(credentials, CLIENT_CONF);
client.setRegion(region);
checkStream(client.describeStream(stream));
System.out.println("Let's start putting records!");
Random rnd = new Random(System.currentTimeMillis());
for (;;) {
putEventRecord(client, stream);
Thread.sleep(rnd.nextInt(500) + 650);
}
}
}